const bcrypt = require("bcryptjs");
const userService = require("../../system/user/service/UserServiceImpl.js");
const wxApi = require("./wxApi.js");
const JWT = require("../../../utils/JWT.js");

// 校验
module.exports = {
  // 账号密码登录
  async doLogin(req, res, next) {
    try {
      const { password } = req.body;
      // 1、校验登录账号
      const user = await userService.checkUserByAccount(req, res, next);

      // 2、校验密码是否正确
      await userService.comparePassword(password, user.password);

      // 3、将用户信息生成token
      const userDetail = user.dataValues;
      // 3.1、删除密码
      delete userDetail.password;

      const tokenStr = JWT.generate(userDetail);

      // 4、返回token及用户信息
      return res.cc({
        ...userDetail,
        token: `Bearer ${tokenStr}`,
      });
    } catch (error) {
      next(error);
    }
  },

  // 刷新token
  async refreshToken(req, res, next) {
    try {
      // 1. 从Header获取旧Token
      const authHeader = req.headers.authorization;
      if (!authHeader || !authHeader.startsWith("Bearer ")) {
        return res.err("无效的Token格式", 401);
      }
      const oldToken = authHeader.split(" ")[1];
      // 2. 解析旧Token（允许过期但需有效签名）
      const payload = JWT.verify(oldToken, {
        ignoreExpiration: true,
      });
      // 3. 检查payload是否包含必要信息（如用户ID）
      if (!payload.id) {
        throw new Error("Invalid token payload");
      }
      // 3. 重新查询用户确保有效性
      const user = await userService.getUserInfoById(payload.id); // 需实现根据ID查询用户的方法
      if (!user) {
        return res.err("用户不存在", 401);
      }
      // 4、将用户信息生成token
      const userDetail = user.dataValues;
      const newToken = JWT.generate(userDetail);
      return res.cc({
        ...userDetail,
        token: `Bearer ${newToken}`,
      });
    } catch (error) {
      // Token解析失败的特殊处理
      if (error.name === "JsonWebTokenError") {
        return res.err("无效的Token", 401);
      }
      next(error);
    }
  },

  // 微信小程序登录
  async doWxLogin(req, res, next) {
    try {
      const { code } = req.body;
      if (!code) {
        res.cc("code不能为空");
      }
      //  1、获取access_token
      const accessToken = await wxApi.getAccessToken();

      // 2、根据前端传递的code及access_token 获取用户手机号
      const phoneNumber = await wxApi.getUserPhoneNumber(code, accessToken);

      //  3、根据手机号查询用户信息
      req.body.mobile = phoneNumber;
      const user = await userService.checkUserByMobile(req, res, next);

      // 4、将用户信息生成token
      const tokenStr = JWT.generate(user.dataValues);

      // 5、返回token及用户信息
      return res.cc({
        ...user.dataValues,
        password: null, // 不返回密码
        token: `Bearer ${tokenStr}`,
      });
    } catch (error) {
      next(error);
    }
  },
};
